////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2016-2017 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file  camxstatsprocessormanager.h
/// @brief Implements managing stats processors.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef CAMXSTATSPROCESSORMANAGER_H
#define CAMXSTATSPROCESSORMANAGER_H

#include "camxdefs.h"
#include "camxistatsprocessor.h"
#include "camxstatscommon.h"
#include "camxtypes.h"
#include "camxutils.h"

CAMX_NAMESPACE_BEGIN

// Forward Declaration
class StatsProcessorManager;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// StatsProcessorManager
///
/// @brief Implementation class for stats job dispatching and scheduling.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class StatsProcessorManager
{
public:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Create
    ///
    /// @brief  Used to initialize the settings class.
    ///
    /// @param  pStatsCreateData        Pointer to stats create data
    /// @param  ppStatsProcessorManager Pointer to created job dispatcher
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static CamxResult Create(
        StatsNodeCreateData*    pStatsCreateData,
        StatsProcessorManager** ppStatsProcessorManager);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Initialize
    ///
    /// @brief  Used to initialize the settings class.
    ///
    /// @param  pStatsInitializeData Pointer to stats initialize data.
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CamxResult Initialize(
        const StatsInitializeData* pStatsInitializeData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// OnProcessRequest
    ///
    /// @brief  Process a new request.
    ///
    /// @param  pStatsProcessRequestDataInfo Pointer to process request information
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CamxResult OnProcessRequest(
        const StatsProcessRequestData* pStatsProcessRequestDataInfo);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetDependencies
    ///
    /// @brief  Get the the list of dependencies from all stats processors.
    ///
    /// @param  pStatsProcessRequestDataInfo    Pointer to process request information
    /// @param  pStatsDependency                Pointer to stats dependencies
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CamxResult GetDependencies(
        const StatsProcessRequestData*  pStatsProcessRequestDataInfo,
        StatsDependency*                pStatsDependency) const;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// IsDependenciesSatisfied
    ///
    /// @brief  Checks if the dependencies is satisfied.
    ///
    /// @param  pStatsProcessRequestDataInfo    Pointer to process request information
    /// @param  pIsSatisfied                    Pointer to Is dependencies satisfied
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CamxResult IsDependenciesSatisfied(
        const StatsProcessRequestData*  pStatsProcessRequestDataInfo,
        BOOL*                           pIsSatisfied) const;


    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Destroy
    ///
    /// @brief  Destroy the class
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    VOID Destroy();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// StatsProcessorManager
    ///
    /// @brief  constructor.
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    StatsProcessorManager();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ~StatsProcessorManager
    ///
    /// @brief  destructor
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ~StatsProcessorManager();


    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// StatsProcessorManagerThreadFlushCb
    ///
    /// @brief  Thread flush callback function.
    ///
    /// @param  pUserData Pointer to callback data
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static VOID StatsProcessorManagerThreadFlushCb(
        VOID* pUserData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetInstanceID
    ///
    /// @brief  Returns current stats node instance ID.
    ///
    /// @return Instance ID
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CAMX_INLINE UINT32 GetInstanceID()
    {
        return m_statsCreateData.instanceId;
    }

private:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// CreateStatsProcessors
    ///
    /// @brief  Creates all the stats processors.
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CamxResult CreateStatsProcessors();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// StatsProcessorManagerJobHandler
    ///
    /// @brief  Handles Jobs received from StatsProcessorManagerThreadCb function
    ///
    /// @param  pStatsProcessRequestInfo Process Request information
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CamxResult StatsProcessorManagerJobHandler(
        StatsProcessRequestData* pStatsProcessRequestInfo);

    StatsProcessorManager(const StatsProcessorManager&)            = delete;    ///< Do not implement copy constructor
    StatsProcessorManager& operator=(const StatsProcessorManager&) = delete;    ///< Do not implement assignment operator

    IStatsProcessor*            m_pAECStatsProcessor;   ///< Pointer to AEC Stats processor
    IStatsProcessor*            m_pAWBStatsProcessor;   ///< Pointer to AWB Stats processor
    IStatsProcessor*            m_pAFDStatsProcessor;   ///< Pointer to AFD Stats processor
    IStatsProcessor*            m_pASDStatsProcessor;   ///< Pointer to ASD Stats processor
    const StatsInitializeData*  m_pStatsInitializeData; ///< Save the stats settings pointer
    StatsNodeCreateData         m_statsCreateData;      ///< Create data from stats node
    UINT32                      m_converganceHist;      ///< Number of requests since last converged (AEC, AWB, AF)
};

CAMX_NAMESPACE_END

#endif // CAMXSTATSPROCESSORMANAGER_H
